Linux jobs 后台进程管理
什么是工作管理?
在只有一个 bash 的环境下,如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,最简单的方法就是利用 &
这个玩意儿了
$ tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432
在该指令的最后面加上一个 &
代表将该指令丢到背景中, 此时 bash 会给予这个指令一个“工作号码(job number)”
在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的, 所以,我们会无法看到提示字符,所以一般需要设置重定向
$ tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
输出的信息都给他传送到 /tmp/log.txt 当中
后台进程管理命令汇总 ⭐
command & # 直接在后台运行程序
ctrl + c # 退出前台的命令,不再执行
ctrl + z # 挂起前台命令暂停执行,回到shell命令行环境中
bg # 将刚挂起的命令放到后台运行
bg %3 # 将第三个job放到后台运行
kill %3 # 杀死第三个job,不再执行
fg # 将刚挂起的命令返回前台运行
fg %3 # 将第三个job返回前台运行
jobs # 察看当前 shell 下运行的所有程序;带 + 表示最新的 jobs;带 - 表示次新的 jobs;其他 jobs 不带符号
jobs 显示后台进程
jobs 命令用于显示 Linux 中的任务列表及任务状态,包括后台运行的任务。
该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。
jobs
-l:显示进程号;
-p:仅任务对应的显示进程号;
-n:显示任务状态的变化;
-r:仅输出运行状态(running)的任务;
-s:仅输出停止状态(stoped)的任务。
这里显示的就是挂在后台的进程
fg 命令(后台转前台)
使用 fg
命令将任务号为 1 的任务从后台执行转换到前台执行,输入如下命令:
用 fg %[number]
指令把一个程序掉到前台
fg %1 #将任务转换到前台执行
也可以直接终止后台运行的程序,使用 kill
命令
kill %1
bg 命令(挂后台)
bg 命令用于将作业放到后台运行,使前台可以执行其他任务。
该命令的运行效果与在指令后面添加符号 &
的效果是相同的,都是将其放到系统后台执行。
使用方式是先使用 ctrl + z 把任务暂停(挂起),然后再使用 jobs 查看它的任务号,然后再使用它将其挂在后台继续执行
nohup 不挂断 ⭐
nohup 是 no hungup 的缩写,即 “不挂断”,在使用 Xshell 等工具执行 Linux 脚本时,有时候会由于网络问题,导致失去连接,终端断开,程序运行一半就意外结束了。这种时候,就可以用 nohup 指令来运行指令,使程序可以忽略挂起信号继续运行。
nohup Command [ Arg ... ] [ & ]
nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup 会把进程打印的东西默认输出到 $HOME/nohup.out
文件中
作业在后台运行的时候,可以把输出重定向到某个文件中,相当于一个日志文件,记录运行过程中的输出。使用方法:
nohup command > out.file 2>&1 &
command>out.file
是将 command 的输出重定向到 out.file
文件,即输出内容不打印到屏幕上,而是输出到 out.file
文件中。
这里的数字代表的意思:
- 0 – stdin (standard input)
- 1 – stdout (standard output)
- 2 – stderr (standard error) ;
而在上面的例子中 2>&1
是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到 out.file
文件中。
nohup 和 & 的区别
&:是指在后台运行,但是当用户退出(挂起)的时候,命令自动跟着结束
nohup:不挂断的运行,注意并没有后台运行的功能,就是指用 nohup 运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开 SSH 连接都不会影响他的运行,注意了 nohup 没有后台运行的意思;&
才是后台运行
例如:
nohup ./hello &
此时默认地程序运行的输出信息放到当前文件夹的 nohup.out
文件中去,加不加 &
并不会影响这个命令。只是让程序前台或者后台运行而已
使用例子
sh test.sh &
将 sh test.sh
任务放到后台 ,关闭 xShell,对应的任务也跟着停止
nohup sh test.sh
将 sh test.sh
任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的 nohup.out
文件,即使关闭 xShell 退出当前 session 依然继续运行(如果不懂的话,可以直接复制上一节的例子代码)
nohup sh test.sh &
将 sh test.sh
任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的 nohup.out
文件,即使关闭 xShell 退出当前 session 依然继续运行
补充:jps 显示 Java 进程
jps 是 jdk 提供的一个 查看当前 java 进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写。
-q: 仅输出 VM 标识符,不包括classname,jar name,arguments in main method
-m: 输出 main method 的参数
-l: 输出完全的包名,应用主类名,jar 的完全路径名
-v: 输出jvm参数
-V: 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
-Joption:传递参数到vm,例如:-J-Xms512m